 1.KuDu常用Api(java)
   
   1).首先创建一个maven工程，添加一下依赖
	<dependency>
		<groupId>org.apache.kudu</groupId>
		<artifactId>kudu-client</artifactId>
		<version>1.4.0</version>
	</dependency>
   2).创建表
   kudu建表几个必须：
   (1).必须指定表连接到的master节点主机名
   (2).必须定义schema
   (3).必须指定副本数量、分区策略和数量
package com.lagou;

import org.apache.kudu.ColumnSchema;
import org.apache.kudu.Schema;
import org.apache.kudu.Type;
import org.apache.kudu.client.CreateTableOptions;
import org.apache.kudu.client.KuduClient;
import org.apache.kudu.client.KuduException;

import java.util.ArrayList;

public class CreateTableDemo {
    /**
     * (1).必须指定表连接到的master节点主机名
     * (2).必须定义schema,声明的每一个字段必须显式的说明是否是主键
     * (3).必须指定副本数量、分区策略和数量
     */
    public static void main(String[] args) {
        //client
        String masterAddresses = "linux122";
        KuduClient.KuduClientBuilder kuduClientBuilder = new KuduClient.KuduClientBuilder(masterAddresses);
        KuduClient client = kuduClientBuilder.build();

        String tableName = "student";
        //id int pkey    name String

        //指定每一列的信息
        ArrayList<ColumnSchema> columnSchemas = new ArrayList<ColumnSchema>();
        ColumnSchema id = new ColumnSchema.ColumnSchemaBuilder("id", Type.INT32).key(true).build();
        ColumnSchema name = new ColumnSchema.ColumnSchemaBuilder("name", Type.STRING).key(false).build();
        columnSchemas.add(id);
        columnSchemas.add(name);
        Schema schema = new Schema(columnSchemas);

        CreateTableOptions options = new CreateTableOptions();
        //设置当前的副本数量为1
        options.setNumReplicas(1);
        ArrayList<String> colrule = new ArrayList<String>();
        colrule.add("id");
        options.addHashPartitions(colrule, 3);

        try {
            client.createTable(tableName, schema,options);
        } catch (KuduException e) {
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (KuduException e) {
                e.printStackTrace();
            }
        }
    }
}
   
   3).删除表
   client.deleteTable
package com.lagou;

import org.apache.kudu.client.KuduClient;
import org.apache.kudu.client.KuduException;

public class DeleteTableDemo {
    public static void main(String[] args) {
        KuduClient client = new KuduClient.KuduClientBuilder("linux122").build();
        try {
            client.deleteTable("student");
        } catch (KuduException e) {
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (KuduException e) {
                e.printStackTrace();
            }
        }
    }
}

   4).插入数据
   思路：
   1 、获取客户端
   2 、打开一张表
   3 、创建会话
   4 、设置刷新模式
   5 、获取插入实例
   6 、声明带插入数据
   7 、刷入数据
   8 、应用插入实例
   9 、关闭会话
   1、AUTO_FLUSH_SYNC（默认），意思是调用 KuduSession.apply() 方法后，客户端会在当数据刷新到服务器后再
返回，这种情况就不能批量插入数据，调用 KuduSession.flush() 方法不会起任何作用，应为此时缓冲区数据已经被
刷新到了服务器。
   2、AUTO_FLUSH_BACKGROUND，意思是调用 KuduSession.apply() 方法后，客户端会立即返回，但是写入将在后
台发送，可能与来自同一会话的其他写入一起进行批处理。如果没有足够的缓冲空间，KuduSession.apply()会阻
塞，缓冲空间不可用。因为写入操作是在后台应用进行的的，因此任何错误都将存储在一个会话本地缓冲区中。注
意：这个模式可能会导致数据插入是乱序的，这是因为在这种模式下，多个写操作可以并发地发送到服务器。即此处
为 kudu 自身的一个 bug,KUDU-1767 已经说明。
   3、MANUAL_FLUSH,意思是调用 KuduSession.apply() 方法后，会返回的非常快,但是写操作不会发送，直到用户使
用flush()函数，如果缓冲区超过了配置的空间限制，KuduSession.apply()函数会返回一个错误。
package com.lagou;


import org.apache.kudu.client.*;

public class InsertDemo {
    public static void main(String[] args) {
        //1 、获取客户端
        KuduClient.KuduClientBuilder builder = new KuduClient.KuduClientBuilder("linux122");
        builder.defaultSocketReadTimeoutMs(5000);
        KuduClient client = builder.build();

        //2 、打开一张表
        try {
            KuduTable stuTable = client.openTable("student");
            //3 、创建会话
            KuduSession kuduSession = client.newSession();
            //4 、设置刷新模式
            kuduSession.setFlushMode(SessionConfiguration.FlushMode.MANUAL_FLUSH);
            //5 、获取插入实例
            Insert insert = stuTable.newInsert();
            //6 、声明带插入数据
            insert.getRow().addInt("id", 1);
            insert.getRow().addString("name", "lucas");
            //7 、刷入数据
            kuduSession.flush();
            //8 、应用插入实例
            kuduSession.apply(insert);
            //9 、关闭会话
            kuduSession.close();
        } catch (KuduException e) {
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (KuduException e) {
                e.printStackTrace();
            }
        }
    }
}

   5).查询数据
   kudu查询数据用scanner
   思路：
   1 、获取client
   2 、获取Scanner
   3 、从Scanner中循环遍历数据
package com.lagou;

import org.apache.kudu.client.*;

public class SelectDemo {
    public static void main(String[] args) {
        //1 、获取client
        KuduClient.KuduClientBuilder builder = new KuduClient.KuduClientBuilder("linux122");
        builder.defaultSocketReadTimeoutMs(5000);
        KuduClient client = builder.build();
        try {
            KuduTable stuTable = client.openTable("student");
            //2 、获取Scanner
            KuduScanner scanner = client.newScannerBuilder(stuTable).build();
            //3 、从Scanner中循环遍历数据
            while (scanner.hasMoreRows()) {
                for (RowResult result : scanner.nextRows()) {
                    int id = result.getInt("id");
                    String name = result.getString("name");
                    System.out.println("id:" + id + "...name:" + name);
                }
            }
        } catch (KuduException e) {
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (KuduException e) {
                e.printStackTrace();
            }
        }
    }
}
   
   6).更改表数据
   和插入数据类似
package com.lagou;

import org.apache.kudu.client.*;

public class UpdateDemo {
    public static void main(String[] args) {
        KuduClient client = new KuduClient.KuduClientBuilder("linux122").build();
        try {
            KuduTable stuTable = client.openTable("student");
            KuduSession kuduSession = client.newSession();
            kuduSession.setFlushMode(SessionConfiguration.FlushMode.MANUAL_FLUSH);
            Update update = stuTable.newUpdate();
            PartialRow row = update.getRow();
            row.addInt("id", 1);
            row.addString("name", "xiaoming");
            kuduSession.apply(update);
            kuduSession.close();
        } catch (KuduException e) {
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (KuduException e) {
                e.printStackTrace();
            }
        }

    }
}
   
   7).删除指定行
   通过封装类Delete
package com.lagou;

import org.apache.kudu.client.*;

public class DeleteDemo {
    public static void main(String[] args) {
        KuduClient client = new KuduClient.KuduClientBuilder("linux122").build();
        try {
            KuduTable stuTable = client.openTable("student");
            KuduSession kuduSession = client.newSession();
            kuduSession.setFlushMode(SessionConfiguration.FlushMode.MANUAL_FLUSH);
            Delete delete = stuTable.newDelete();
            PartialRow row = delete.getRow();
            row.addInt("id", 1);
            kuduSession.flush();
            kuduSession.apply(delete);
            kuduSession.close();
        } catch (KuduException e) {
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (KuduException e) {
                e.printStackTrace();
            }
        }
    }
}
